package com.study.config;

import com.study.test.TestMessageListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.serializer.RedisSerializer;

/**
 * @author ytj
 * @date 2021/11/4
 */
@Configuration
public class RedisConfiguration {

    /**
     * redisTemplate配置
     * */
    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){
        //创建redisTemplate对象
        RedisTemplate<String,Object> redisTemplate=new RedisTemplate<>();
        //设置redisConnection工程，它就是实现多种java redis 客户端接入的工厂
        redisTemplate.setConnectionFactory(factory);
        //使用string序列化，序列化key
        redisTemplate.setKeySerializer(RedisSerializer.string());
        //使用json序列化方式(库是Jackson),序列化value
//        redisTemplate.setValueSerializer(RedisSerializer.json());
        //在使用批量插入的时候不能需要使用二进制或者字符串的方式序列化value
        redisTemplate.setValueSerializer(RedisSerializer.string());
        return redisTemplate;
    }

    /**
     * 添加redis的pub/sub消息订阅
     * redis的pub/sub的消息订阅会出现消息丢失的情况，一般使用比较少，在对数据使用不严格的场景中可以使用
     * */
    @Bean
    public RedisMessageListenerContainer listenerContainer(RedisConnectionFactory factory){
        //创建对象
        RedisMessageListenerContainer listenerContainer=new RedisMessageListenerContainer();
        //设置redisConnection工厂
        listenerContainer.setConnectionFactory(factory);
        //添加监听器(监听器可以添加多个，但是只能添加一种类型，添加channelTopic之后就不能添加patternTopic)
        listenerContainer.addMessageListener(new TestMessageListener(),new ChannelTopic("TEST"));
        return listenerContainer;
    }
}
